package IO;
//"文件系统操作"->操作文件的属性
//                 操作文件的内容->读,写文件内容

//在Java标准库中,读写文件相关的类,有很多.
// InputStream/FileInputStream 文件读取操作.按照字节为单位进行读文件
// OutputStream/FileOutputStream 文件写入操作.按照字节为单位进行写文件

//字节流 ~  Stream流
//由于是字节流,最小单位就是字节,Java除了字节流之外,还有字符流,以字符为单位,进行读写

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

/**
 *
 * 字节vs字符
 * byte  char
 * 8      16
 */

/**
 * 关于资源泄漏~
 *  系统中的很多资源都是有限的~ 内存,文件描述符
 *  --
 *
 *  --
 *
 */
public class fileDemo3 {
    //FileNotFoundException其实是继承自IOException
    public static void main1(String[] args)  {
        //这个创建实例的过程,就相当于是在打开文件
        //要先打开文件,才能进行读写
        //           抽象类             具体的实现的类
        InputStream inputStream = null;
        try{
             inputStream =  new FileInputStream("./test.txt");
            //逐个字节的方式把文件内容读取出来
            while(true){
                //每次调用read就可以读取一些数据出来
                //read提供好几个版本,其中无参数的版本就是一次读取一个字节
                //对于这个无惨版本的read来说,返回值就是这次操作读到的字节.
                //这个结果的范围就是0-255
                //如果读到文件末尾(EOF,end of file),此时继续进行read,就会返回-1
                int b = inputStream.read(); //需要处理输入输出异常
                if (b == -1){
                    break;
                }
                System.out.printf("%c",b);
            }

        }catch(IOException e){
            e.printStackTrace();
        }finally{
            //文件的关闭
            //使用流对象,读写完文件后,一定要及时关闭!!
            //如果没有关闭(释放),就可能造成资源泄漏.
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            //如果在读取的过程中出现异常,就有可能调用不到close,就无法关闭文件.在finally进行调用就是为了解决这个问题
        }
    //close代码写到这个finally中才是更科学的做法.但是,我们可以明显的感觉到这样很繁琐
        //Java中提供了try with resources语法
        //可以更好的解决这个问题

    }

    public static void main(String[] args) {
        //这种写法应用了try with resources语法
        //能更简单的完成这个工作

        try(InputStream inputStream = new FileInputStream("./test.txt")){
            while(true) {
                int b = inputStream.read();
                if (b == -1) {
                    break;
                }
                System.out.printf("%c", b);
            }
        }catch(IOException e){
            e.printStackTrace();
        }
    }
}
